06 / 10

What's a good practice for storing large binary blobs (e.g., raw images) associated with a point, given payloads are meant for structured metadata?

Store a reference (URL or object-storage key) in the payload, not the blob itself

The standard practice is to store the blob in an object store (S3, GCS, Azure Blob) or a dedicated content store, and put a reference to it in the Qdrant payload. The reference is typically a URL, an object-storage key, or an opaque content ID. The payload then holds only the metadata needed for filtering, ranking, and retrieval, and the application resolves the reference when it needs the blob. This keeps the payload small, which keeps the payload index small, the memory footprint small, and the response size small. It also lets the blob be served from a CDN or a dedicated content service with its own caching, access control, and lifecycle management, which is a better fit for large binaries than a vector database. The pattern is the same as storing PII: keep the vector database for what it is good at (vectors and metadata) and put the large or sensitive content elsewhere.

The mechanism that makes this work is that Qdrant is optimized for small, structured payloads that can be indexed and filtered. Large binary content is not indexable, cannot be filtered on efficiently, and dominates the storage and memory cost. If you store an image in the payload, every payload read during a filtered query has to read the image bytes (or a pointer to them) and every response that returns the payload has to serialize and transmit the image. The result is slow queries, large responses, and a collection that uses far more memory than necessary. Storing a reference avoids all of this: the payload holds a short string, the index stays small, and the blob is fetched only when the application actually needs to display or process it. The trade-off is that the application now has two stores to manage and must handle the case where the reference points to a missing or inaccessible blob. In practice this is a small cost compared to the performance benefit.

  1. 1

    Store in object storage: S3, GCS, Azure Blob, or a dedicated content service.

  2. 2

    Store a reference in the payload: URL, object-storage key, or opaque content ID.

  3. 3

    Keep payload small: only metadata needed for filtering, ranking, and retrieval.

  4. 4

    Access control: the object store has its own access control, which can be finer-grained than Qdrant's.

  5. 5

    CDN: serve the blob from a CDN for caching and low latency.

  6. 6

    Lifecycle: object stores have lifecycle policies for retention and archival.

  7. 7

    Handle missing references: the application must gracefully handle a reference that points to a deleted or inaccessible blob.

The trade-off is between simplicity and performance. Storing the blob in the payload is simpler - one store, one API - but it degrades every aspect of the system's performance and cost. Storing a reference requires the application to manage two stores and to handle the failure modes of the external store, but it keeps Qdrant fast and small. The common mistake is to store base64-encoded blobs in the payload because it is convenient, which inflates the payload by 33 percent and makes every query slower. The second mistake is to store a reference that is not stable - for example, a URL that changes when the blob is moved - which breaks the link between the point and its content. The third mistake is to store the blob in a local filesystem on the Qdrant node, which defeats the purpose of an object store and makes the node stateful in a way that complicates scaling and recovery. The fourth mistake is to forget to set up a lifecycle policy on the object store, so blobs accumulate forever and cost more than they should. Version note: Qdrant's payload storage and index types have evolved, but the principle of keeping payloads small and structured is version-independent. Some features (e.g. full-text indexes) assume text payloads, and very large text payloads are as problematic as binary blobs.

javascript

Version-dependent: the payload storage and index types have changed across Qdrant releases, but the best practice of storing references rather than blobs is version-independent. Some versions support on-disk payload storage, which reduces the memory cost of payloads, but it does not eliminate the cost of large payloads - it moves it to disk. If your payloads are large because of legitimate text content (e.g. chunk text), consider whether the text needs to be in the payload or whether a reference to a separate text store would be better.

Difficulty: 5/10
Topics: Payload Schema, Object Storage, Best Practices

Scenario Questions

0-2 years experience
  1. 1

    You store base64-encoded images in the payload and queries are slow. Explain why and how to restructure the data.

  2. 2

    A teammate says storing the blob in the payload is simpler because there is only one store. Explain the hidden costs.

2-5 years experience
  1. 1

    You need to migrate from storing blobs in the payload to storing references. Describe the migration plan and how you would validate it.

  2. 2

    Your application needs to display the image in search results. Describe the pattern that retrieves the blob efficiently without bloating the Qdrant response.

5-8 years experience
  1. 1

    Design a content architecture for a media search system where the vectors live in Qdrant and the media lives in object storage. Specify the payload schema, the access control, the CDN, and the lifecycle.

  2. 2

    You need to support both fast search and immediate media display. Describe the caching and prefetching strategy that meets the latency target.

8+ years experience
  1. 1

    You are designing a system that must store and search 1 billion images with strict access control and a 100ms p99 for search plus first-byte display. Describe the architecture and the trade-offs.

  2. 2

    An object store outage affects your search results because the references cannot be resolved. Describe the resilience strategy and how you would communicate the degradation to users.

Follow-up Questions

  • How would you handle access control for blobs stored in an object store, given that Qdrant's access control does not extend to the blob store?
  • If the blob store is unavailable, how should the application behave, and how would you design for graceful degradation?